///********************************************
// * 功能说明: 
// * 模块名称: 
// * 系统名称: 
// * 软件版权: Frank
// * 系统版本: 1.0.0
// * 开发人员: Frank
// * 开发时间: 2019/12/7 15:43
// * 审核人员: 
// * 相关文档: 
// * 修改记录: 修改日期 修改人员 修改说明
// *********************************************/
//package com.spring.arch.config;
//
//import java.io.IOException;
//import java.util.UUID;
//
//import javax.annotation.Resource;
//import javax.servlet.FilterChain;
//import javax.servlet.ServletException;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//import org.springframework.web.filter.OncePerRequestFilter;
//
//import com.spring.arch.common.db.DatasourceStatus;
//import com.spring.arch.common.dto.result.ResultDTO;
//import com.spring.arch.common.utils.HttpUtils;
//import com.spring.arch.datasource.client.DatasourceClient;
//import com.spring.arch.datasource.core.context.DatasourceParamConfig;
//import com.spring.arch.datasource.core.context.InstanceContextHolder;
//import com.spring.arch.datasource.core.helper.DBOperationHelper;
//import com.spring.arch.datasource.core.helper.InstanceDataSourceProvider;
//import com.spring.arch.datasource.dto.DatasourceConfigDTO;
//import com.spring.arch.operation.common.enums.Constant;
//
//import lombok.extern.slf4j.Slf4j;
//
///**
// * @author Frank
// * @version 1.0.0.1
// * @since 2019/12/7 15:43
// */
//@Order
//@Component
//@Slf4j
//public class ClientFilter extends OncePerRequestFilter {
//
//    @Autowired
//    private DBOperationHelper dbOperationHelper;
//    @Resource
//    private DatasourceClient datasourceClient;
//
//    @Override
//    protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
//        final String clientId = request.getHeader(Constant.HEADER_CLIENT_ID);
//        return StringUtils.isBlank(clientId);
//    }
//
//    @Override
//    protected void doFilterInternal(HttpServletRequest request,
//                                    HttpServletResponse response,
//                                    FilterChain filterChain) throws IOException, ServletException {
//        String clientIP = HttpUtils.getClientIP(request);
//        String requestURI = request.getRequestURI();
//        String clientId = request.getHeader(Constant.HEADER_CLIENT_ID);
//        if (StringUtils.isNotBlank(clientId)) {
//            // 初始化实例数据源
//            initInstanceDatasource(clientId, clientIP, requestURI);
//        }
//        filterChain.doFilter(request, response);
//    }
//
//    private void initInstanceDatasource(String clientId, String clientIP, String requestURI) {
//        try {
//            String schemaCode = InstanceDataSourceProvider.getSchemaByProjectId(clientId);
//            if (StringUtils.isBlank(schemaCode)) {
//                // 查询数据源信息
//                ResultDTO<DatasourceConfigDTO> resultDTO = datasourceClient.getProjectId(UUID.fromString(clientId));
//                if (resultDTO.isFailure() || resultDTO.getData() == null) {
//                    log.error("调用admin获取数据源信息[{}]异常，响应信息[{}]，响应结果[{}]", clientId, resultDTO.getMessage(), resultDTO.getData());
//                    return;
//                }
//                DatasourceConfigDTO configDTO = resultDTO.getData();
//                if (DatasourceStatus.OFFLINE.equals(configDTO.getStatus())) {
//                    log.error("调用admin获取数据源状态[{}]异常，响应信息[{}]，响应结果[{}]", clientId, resultDTO.getMessage(), resultDTO.getData());
//                    return;
//                }
//                // 执行初始化
//                dbOperationHelper.initializeDataSource(toParamConfig(configDTO));
//                // 回调更新数据源状态
//                ResultDTO<Void> callRes = datasourceClient.initializeDataSource(UUID.fromString(clientId));
//                if (callRes.isFailure()) {
//                    log.error("调用admin更新数据源初始化状态[{}]异常，响应信息[{}]", clientId, callRes.getMessage());
//                    return;
//                }
//                schemaCode = configDTO.getSchemaName();
//            }
//            // 切换数据源
//            InstanceContextHolder.setInstance(schemaCode);
//        } catch (Exception e) {
//            log.error("切换数据源[{}]异常,请求[{}-{}]", clientId, clientIP, requestURI, e);
//        }
//    }
//
//    private DatasourceParamConfig toParamConfig(DatasourceConfigDTO configDTO) {
//        return new DatasourceParamConfig(configDTO.getProjectId(),
//                configDTO.getSchemaName(),
//                configDTO.getUrl(),
//                configDTO.getUsername(),
//                configDTO.getPassword(), configDTO.getStatus());
//    }
//}
